#include <iostream>

// 模版元编程

// 模拟case
template <int N>
struct Case
{
};

template <>
struct Case<1> // 特化
{
    static std::string value()
    {
        return "1";
    }
};

template <>
struct Case<2> // 特化
{
    static std::string value()
    {
        return "2";
    }
};

// 循环
template <int start, int end>
struct For // 循环终止
{
    static void value()
    {
        std::cout << start << std::endl;
        For<start + 1, end>::value();
    }
};
// 偏特化
template <int end>
struct For<end, end> // 循环终止
{
    static void value()
    {
    }
};

// 枚举可以在编译期做加法
template <int N>
struct Data
{
    enum
    {
        result = Data<N - 1>::result + Data<N - 2>::result
    };
};

template <>
struct Data<1>
{
    enum
    {
        result = 1
    };
};

template <>
struct Data<2>
{
    enum
    {
        result = 1
    };
};

int main()
{
    // std::cout<<Case<1>::value()<<std::endl;
    // std::cout<<Case<2>::value()<<std::endl;

    // For<0, 5>::value();  // O(1)
   std::cout<<Data<20>::result<<std::endl;

    return 0;
}